iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
Software Development

Ruby 研究 30 天系列 第 23

Day 22 - 引數與參數 上篇

  • 分享至 

  • xImage
  •  

引數與參數

在學習程式語言時,方法的使用是絕對無法避免的,而參數(parameter)與引數(argument)這兩個名詞,的確很容易使初學者混亂。

"We will generally use parameter for a variable named in the parenthesized list in a function definition, and argument for the value used in a call of the function. The terms formal argument and actual argument are sometimes used for the same distinction." -—《The C Programming Language》Section 1.7 K&R

parameter, argument, formal parameter, formal argument, actual argument,這幾個名詞隨著時代輪流的被提出也依次的被替換,目的其實就是為了讓學習程式語言的人能有一個更嚴謹的定義而不搞混。簡單的說,參數就是此方法所需要的變數,而引數就是對應給參數的值。
舉個例子:參數就是考場中的應到人數,每個位子都有期望的考生入座,而引數就是實際來的考生,引數錯誤就是缺考或是有多餘的人跑錯考場。如同一個考試可以團體報名、個人報名或同等學歷報名一樣,引數的帶入也有多種方式。

  • Standard Argument
    可以很直譯的翻作標準引數,就是最一般的帶入方式,一個參數對應一個值,順序和個數都要正確。
class Introduction
  def initialize(name, age, email, city, language)
    @name = name
    @age = age
    @email = email
    @city = city
    @language = language
  end

  def say
    puts "我的名字是:#{@name},年紀:#{@age},可以用#{@email}聯絡我,標準#{@city}人,正在學習#{@language},請多指教! "
  end
end
  • Optional Argument
    選擇性引數,藉由給予預設值讓我們可以選擇性的不給予引數。
def initialize(name, age, email, city = "Taipei", language = "Ruby")
#...下略
  • Keyword Argument
    關鍵字引數,顧名思義就是為引數前面加一個關鍵字,如同之前談過的 Hash 章節,有了關鍵字後引數的順序可以不顧慮順序的安排,用 Keyword Argument 一樣也可以加上預設值。
class Introduction
  def initialize(name:, age:, email: , city: "Taipei", language: "Ruby")
    @name = name
    @age = age
    @email = email
    @city = city
    @language = language
  end

  def say
    puts "我的名字是:#{@name},年紀:#{@age},可以用#{@email}聯絡我,標準#{@city}人,正在學習#{@language},請多指教! "
  end
end

Karen = Introduction.new(age: 18, email: "cute@cjhan.tw", name: "Karen")
Karen.say

到目前為止應該會有人會覺得那用 Hash 就好了啊,感覺效果是一樣的,所以 optional hashkeyword argument 到底差在哪裡呢?想像一下今天的自我介紹是要用在正式場合的,那麼所給的資料當然不能用預設值來打混過去吧!

class Introduction
  def initialize(profile)
    @name = profile[:name]
    @age = profile[:age]
    @email = profile[:email]
    @city = profile[:city]
    @language = profile[:language]
  end

  def say
    puts "我的名字是 #{@name},今年 #{@age} 歲,可以用 #{@email} 聯絡我,標準#{@city}人,正在學習 #{@language},請多指教! "
  end
end
Karen = Introduction.new(name: "Karen", email: "cute@cjhan.tw", language: "Ruby")
Karen.say

如果是用 optinal hash 的話引數少給也不會產生錯誤訊息;而如果用 keyword argument 的話可以看到因引數錯誤的訊息,也會提示少給了哪幾項引數。

class Introduction
  def initialize(name:, age:, email: ,city: , language: )
    @name = name
    @age = age
    @email = email
    @city = city
    @language = language
  end

  def say
    puts "我的名字是:#{@name},年紀:#{@age},可以用#{@email}聯絡我,標準#{@city}人,正在學習#{@language},請多指教! "
  end
end

Karen = Introduction.new(name: "Karen", email: "cute@cjhan.tw", language: "Ruby")
Karen.say     # missing keywords: age, city

明天我們來把剩下的引數帶入方式介紹完。

此文同步刊登於CJ-Han的網站


上一篇
Day 21 - Module 模組
下一篇
Day 23 - 引數與參數 下篇
系列文
Ruby 研究 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言